-- ToME - Tales of Maj'Eyal
-- Copyright (C) 2009, 2010, 2011, 2012 Nicolas Casalini
--
-- This program is free software: you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation, either version 3 of the License, or
-- (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
--
-- Nicolas Casalini "DarkGod"
-- darkgod@te4.org

require "engine.class"
local Dialog = require "engine.ui.Dialog"
local TreeList = require "engine.ui.TreeList"
local Textzone = require "engine.ui.Textzone"
local Separator = require "engine.ui.Separator"
local GetQuantity = require "engine.dialogs.GetQuantity"

module(..., package.seeall, class.inherit(Dialog))

function _M:init()
	Dialog.init(self, "Настройки игры", game.w * 0.8, game.h * 0.8)

	self.c_desc = Textzone.new{width=math.floor(self.iw / 2 - 10), height=self.ih, text=""}

	self:generateList()

	self.c_list = TreeList.new{width=math.floor(self.iw / 2 - 10), height=self.ih - 10, scrollbar=true, columns={
		{width=60, display_prop="name"},
		{width=40, display_prop="status"},
	}, tree=self.list, fct=function(item) end, select=function(item, sel) self:select(item) end}

	self:loadUI{
		{left=0, top=0, ui=self.c_list},
		{right=0, top=0, ui=self.c_desc},
		{hcenter=0, top=5, ui=Separator.new{dir="horizontal", size=self.ih - 10}},
	}
	self:setFocus(self.c_list)
	self:setupUI()

	self.key:addBinds{
		EXIT = function() game:unregisterDialog(self) end,
	}
end

function _M:select(item)
	if item and self.uis[2] then
		self.uis[2].ui = item.zone
	end
end

function _M:generateList()
	-- Makes up the list
	local list = {}
	local i = 0

	local zone = Textzone.new{width=self.c_desc.w, height=self.c_desc.h, text=string.toTString"Расстояние от персонажа до края экрана, при котором будет выполняться прокрутка. Чем больше число, ближе к центру экрана будет находиться персонаж.#WHITE#"}
	list[#list+1] = { zone=zone, name=string.toTString"#GOLD##{bold}#Дистанция прокрутки#WHITE##{normal}#", status=function(item)
		return tostring(config.settings.tome.scroll_dist)
	end, fct=function(item)
		game:registerDialog(GetQuantity.new("Дистанция прокрутки", "От 1 до 30 ", config.settings.tome.scroll_dist, 30, function(qty)
			qty = util.bound(qty, 1, 30)
			game:saveSettings("tome.scroll_dist", ("tome.scroll_dist = %d\n"):format(qty))
			config.settings.tome.scroll_dist = qty
			self.c_list:drawItem(item)
		end, 1))
	end,}

	local zone = Textzone.new{width=self.c_desc.w, height=self.c_desc.h, text=string.toTString"Фоновое сохранение позволяет выполнять сохранение игры без прерывания игрового процесса. Если отключить, сохранения будут выполняться быстрее, но игра во время сохранения будет недоступна.#WHITE#"}
	list[#list+1] = { zone=zone, name=string.toTString"#GOLD##{bold}#Фоновое сохранение#WHITE##{normal}#", status=function(item)
		return tostring(config.settings.background_saves and "включено" or "отключено")
	end, fct=function(item)
		config.settings.background_saves = not config.settings.background_saves
		game:saveSettings("background_saves", ("background_saves = %s\n"):format(tostring(config.settings.background_saves)))
		self.c_list:drawItem(item)
	end,}

	local zone = Textzone.new{width=self.c_desc.w, height=self.c_desc.h, text=string.toTString"Включение сохранения при переходе на новую зону подземелья.\nСохранения будут выполняться чаще, но памяти игра будет требовать меньше.\n\n#LIGHT_RED#Изменение этой настройки не даст эффекта на уже сформированных картах.\n*ПРИ ТАКОМ РЕЖИМЕ СОХРАНЕНИЙ НЕ ВЫПОЛНЯЕТСЯ ПОЛНОЕ СОХРАНЕНИЕ КАЖДОГО УРОВНЯ*.#WHITE#"}
	list[#list+1] = { zone=zone, name=string.toTString"#GOLD##{bold}#Сохранять уровни позонно#WHITE##{normal}#", status=function(item)
		return tostring(config.settings.tome.save_zone_levels and "включено" or "отключено")
	end, fct=function(item)
		config.settings.tome.save_zone_levels = not config.settings.tome.save_zone_levels
		game:saveSettings("tome.save_zone_levels", ("tome.save_zone_levels = %s\n"):format(tostring(config.settings.tome.save_zone_levels)))
		self.c_list:drawItem(item)
	end,}

	local zone = Textzone.new{width=self.c_desc.w, height=self.c_desc.h, text=string.toTString"Включеие 'плавного' перемещения персонажей. Если установить в 0, перемещение будет мгновенным.\nБольшие значения замедляют перемещениеr.\n\nВажно: Это никак не отразится на походовости игры. Несмотря на то, что можно отдавать новые команды в процессе движения персонажа, игра всё равно будет правильно обсчитывать анимацию."}
	list[#list+1] = { zone=zone, name=string.toTString"#GOLD##{bold}#Плавное перемещение персонажей#WHITE##{normal}#", status=function(item)
		return tostring(config.settings.tome.smooth_move)
	end, fct=function(item)
		game:registerDialog(GetQuantity.new("Скорость перемещения (чем меньше, тем быстрее)", "От 0 до 60 ", config.settings.tome.smooth_move, 60, function(qty)
			game:saveSettings("tome.smooth_move", ("tome.smooth_move = %d\n"):format(qty))
			config.settings.tome.smooth_move = qty
			engine.Map.smooth_scroll = qty
			self.c_list:drawItem(item)
		end))
	end,}

	local zone = Textzone.new{width=self.c_desc.w, height=self.c_desc.h, text=string.toTString"Если эта опция включена, персонажи будут немного 'подталкивать' противников при движении или атаке.#WHITE#"}
	list[#list+1] = { zone=zone, name=string.toTString"#GOLD##{bold}#Толчки при движении и атаке#WHITE##{normal}#", status=function(item)
		return tostring(config.settings.tome.twitch_move and "включено" or "отключено")
	end, fct=function(item)
		config.settings.tome.twitch_move = not config.settings.tome.twitch_move
		game:saveSettings("tome.twitch_move", ("tome.twitch_move = %s\n"):format(tostring(config.settings.tome.twitch_move)))
		self.c_list:drawItem(item)
	end,}

	local zone = Textzone.new{width=self.c_desc.w, height=self.c_desc.h, text=string.toTString"Включение погодных эффектов на некоторых игровых картах.\nОтключение этой настройки позволит поднять производительность. Не даст эффекта на уже созданных картах.#WHITE#"}
	list[#list+1] = { zone=zone, name=string.toTString"#GOLD##{bold}#Погодные эффекты#WHITE##{normal}#", status=function(item)
		return tostring(config.settings.tome.weather_effects and "включено" or "отключено")
	end, fct=function(item)
		config.settings.tome.weather_effects = not config.settings.tome.weather_effects
		game:saveSettings("tome.weather_effects", ("tome.weather_effects = %s\n"):format(tostring(config.settings.tome.weather_effects)))
		self.c_list:drawItem(item)
	end,}

	local zone = Textzone.new{width=self.c_desc.w, height=self.c_desc.h, text=string.toTString"Включение изменения освещённости в зависимости от времени суток.#WHITE#"}
	list[#list+1] = { zone=zone, name=string.toTString"#GOLD##{bold}#Смена дня и ночи#WHITE##{normal}#", status=function(item)
		return tostring(config.settings.tome.daynight and "включено" or "отключено")
	end, fct=function(item)
		config.settings.tome.daynight = not config.settings.tome.daynight
		game:saveSettings("tome.daynight", ("tome.daynight = %s\n"):format(tostring(config.settings.tome.daynight)))
		self.c_list:drawItem(item)
	end,}

	local zone = Textzone.new{width=self.c_desc.w, height=self.c_desc.h, text=string.toTString"Включение размытия тумана войныr.\nЕсли отключить, тума войны станет 'квадратным', но это увеличит производительность.#WHITE#"}
	list[#list+1] = { zone=zone, name=string.toTString"#GOLD##{bold}#Размытие тумана войны#WHITE##{normal}#", status=function(item)
		return tostring(config.settings.tome.smooth_fov and "включено" or "отключено")
	end, fct=function(item)
		config.settings.tome.smooth_fov = not config.settings.tome.smooth_fov
		game:saveSettings("tome.smooth_fov", ("tome.smooth_fov = %s\n"):format(tostring(config.settings.tome.smooth_fov)))
		self.c_list:drawItem(item)
	end,}

	local zone = Textzone.new{width=self.c_desc.w, height=self.c_desc.h, text=string.toTString"Выбор внешнего вида интерфейса. По умолчанию используется Металл. Простой интерфейс занимает минимум места на экране.\n\n#LIGHT_RED#После изменения необходимо перезапустить игру."}
	list[#list+1] = { zone=zone, name=string.toTString"#GOLD##{bold}#Интерфейс#WHITE##{normal}#", status=function(item)
		return tostring(config.settings.tome.ui_theme2):capitalize()
	end, fct=function(item)
		Dialog:listPopup("Интерфейс", "Выберите интерфейс", {{name="Металл", ui="metal"}, {name="Камень", ui="stone"}, {name="Простой", ui="simple"}}, 300, 200, function(sel)
			if not sel or not sel.ui then return end
			game:saveSettings("tome.ui_theme2", ("tome.ui_theme2 = %q\n"):format(sel.ui))
			config.settings.tome.ui_theme2 = sel.ui
			self.c_list:drawItem(item)
		end)
	end,}

	local zone = Textzone.new{width=self.c_desc.w, height=self.c_desc.h, text=string.toTString"Выбор внешнего вида индикаторов на экране. По умолчанию используется Минималист.\n\n#LIGHT_RED#После изменения необходимо перезапустить игру."}
	list[#list+1] = { zone=zone, name=string.toTString"#GOLD##{bold}#Индикаторы#WHITE##{normal}#", status=function(item)
		return tostring(config.settings.tome.uiset_mode):capitalize()
	end, fct=function(item)
		local huds = {{name="Минималист", ui="Minimalist"}, {name="Классика", ui="Classic"}}
		self:triggerHook{"GameOptions:HUDs", huds=huds}
		Dialog:listPopup("Индикаторы", "Выберите индикаторы", huds, 300, 200, function(sel)
			if not sel or not sel.ui then return end
			game:saveSettings("tome.uiset_mode", ("tome.uiset_mode = %q\n"):format(sel.ui))
			config.settings.tome.uiset_mode = sel.ui
			self.c_list:drawItem(item)
		end)
	end,}

	local zone = Textzone.new{width=self.c_desc.w, height=self.c_desc.h, text=string.toTString"Выбор внешнего вида шрифтов. По умолчанию используется Фантазия. Базовые шрифты проще и меньше.\n\n#YELLOW#Примечание переводчика: Не все шрифты поддерживают русский язык. Если в шрифте не будет русских букв, вместо них отобразятся пробелы. Будьте осторожны!\n\n#LIGHT_RED#После изменения необходимо перезапустить игру."}
	list[#list+1] = { zone=zone, name=string.toTString"#GOLD##{bold}#Font Style#WHITE##{normal}#", status=function(item)
		return tostring(config.settings.tome.fonts.type):capitalize()
	end, fct=function(item)
		Dialog:listPopup("Font style", "Select font", {{name="Фантазия", type="fantasy"}, {name="Базовые", type="basic"}}, 300, 200, function(sel)
			if not sel or not sel.type then return end
			game:saveSettings("tome.fonts", ("tome.fonts = { type = %q, size = %q }\n"):format(sel.type, config.settings.tome.fonts.size))
			config.settings.tome.fonts.type = sel.type
			self.c_list:drawItem(item)
		end)
	end,}

	local zone = Textzone.new{width=self.c_desc.w, height=self.c_desc.h, text=string.toTString"Выбор размера шрифта.\n\n#LIGHT_RED#После изменения необходимо перезапустить игру."}
	list[#list+1] = { zone=zone, name=string.toTString"#GOLD##{bold}#Размер шрифта#WHITE##{normal}#", status=function(item)
		return tostring(config.settings.tome.fonts.size):capitalize()
	end, fct=function(item)
		Dialog:listPopup("Font size", "Select font", {{name="Обычный", size="normal"},{name="Маленький", size="small"},{name="Большой", size="big"},}, 300, 200, function(sel)
			if not sel or not sel.size then return end
			game:saveSettings("tome.fonts", ("tome.fonts = { type = %q, size = %q }\n"):format(config.settings.tome.fonts.type, sel.size))
			config.settings.tome.fonts.size = sel.size
			self.c_list:drawItem(item)
		end)
	end,}

	local zone = Textzone.new{width=self.c_desc.w, height=self.c_desc.h, text=string.toTString"Включение перемещений персонажа по левому клику мыши.#WHITE#"}
	list[#list+1] = { zone=zone, name=string.toTString"#GOLD##{bold}#Перемещение по клику мыши#WHITE##{normal}#", status=function(item)
		return tostring(config.settings.mouse_move and "enabled" or "disabled")
	end, fct=function(item)
		config.settings.mouse_move = not config.settings.mouse_move
		game:saveSettings("mouse_move", ("mouse_move = %s\n"):format(tostring(config.settings.mouse_move)))
		self.c_list:drawItem(item)
	end,}

	local zone = Textzone.new{width=self.c_desc.w, height=self.c_desc.h, text=string.toTString"Время, через которое экраны лога и чата становятся невидимыми.\nУстановите в 0, есл не хотите, чтобы они исчезали с экрана."}
	list[#list+1] = { zone=zone, name=string.toTString"#GOLD##{bold}#Время исчезновения лога#WHITE##{normal}#", status=function(item)
		return tostring(config.settings.tome.log_fade)
	end, fct=function(item)
		game:registerDialog(GetQuantity.new("Время исчезновения (сек.)", "От 0 до 20", config.settings.tome.log_fade, 20, function(qty)
			qty = util.bound(qty, 0, 20)
			game:saveSettings("tome.log_fade", ("tome.log_fade = %d\n"):format(qty))
			config.settings.tome.log_fade = qty
			game.uiset.logdisplay:enableFading(config.settings.tome.log_fade)
			profile.chat:enableFading(config.settings.tome.log_fade)
			self.c_list:drawItem(item)
		end, 0))
	end,}

	local zone = Textzone.new{width=self.c_desc.w, height=self.c_desc.h, text=string.toTString"Настройка фильтрации сообщений в чате.#WHITE#"}
	list[#list+1] = { zone=zone, name=string.toTString"#GOLD##{bold}#Фильтр чата#WHITE##{normal}#", status=function(item)
		return "select to configure"
	end, fct=function(item)
		game:registerDialog(require("engine.dialogs.ChatFilter").new({
			{name="Смерти", kind="death"},
			{name="Предметы и монстры", kind="link"},
		}))
	end,}

	if game.uiset:checkGameOption("icons_temp_effects") then
		local zone = Textzone.new{width=self.c_desc.w, height=self.c_desc.h, text=string.toTString"Включение использования иконок для индикации состояния персонажа.#WHITE#"}
		list[#list+1] = { zone=zone, name=string.toTString"#GOLD##{bold}#Иконки статусов#WHITE##{normal}#", status=function(item)
			return tostring(config.settings.tome.effects_icons and "включено" or "отключено")
		end, fct=function(item)
			config.settings.tome.effects_icons = not config.settings.tome.effects_icons
			game:saveSettings("tome.effects_icons", ("tome.effects_icons = %s\n"):format(tostring(config.settings.tome.effects_icons)))
			game.player.changed = true
			self.c_list:drawItem(item)
		end,}
	end

	if game.uiset:checkGameOption("icons_hotkeys") then
		local zone = Textzone.new{width=self.c_desc.w, height=self.c_desc.h, text=string.toTString"Использование иконок в панели инструментов.#WHITE#"}
		list[#list+1] = { zone=zone, name=string.toTString"#GOLD##{bold}#Иконки в панели#WHITE##{normal}#", status=function(item)
			return tostring(config.settings.tome.hotkey_icons and "включено" or "отключено")
		end, fct=function(item)
			config.settings.tome.hotkey_icons = not config.settings.tome.hotkey_icons
			game:saveSettings("tome.hotkey_icons", ("tome.hotkey_icons = %s\n"):format(tostring(config.settings.tome.hotkey_icons)))
			game.player.changed = true
			game:resizeIconsHotkeysToolbar()
			self.c_list:drawItem(item)
		end,}
	end

	if game.uiset:checkGameOption("hotkeys_rows") then
		local zone = Textzone.new{width=self.c_desc.w, height=self.c_desc.h, text=string.toTString"Число строк в панели инструментов.#WHITE#"}
		list[#list+1] = { zone=zone, name=string.toTString"#GOLD##{bold}#Число строк панели#WHITE##{normal}#", status=function(item)
			return tostring(config.settings.tome.hotkey_icons_rows)
		end, fct=function(item)
			game:registerDialog(GetQuantity.new("Введите число строк", "От 1 до 4", config.settings.tome.hotkey_icons_rows, 4, function(qty)
				qty = util.bound(qty, 1, 4)
				game:saveSettings("tome.hotkey_icons_rows", ("tome.hotkey_icons_rows = %d\n"):format(qty))
				config.settings.tome.hotkey_icons_rows = qty
				game:resizeIconsHotkeysToolbar()
				self.c_list:drawItem(item)
			end, 1))
		end,}
	end

	local zone = Textzone.new{width=self.c_desc.w, height=self.c_desc.h, text=string.toTString"Размер иконок в панели инструментов.#WHITE#"}
	list[#list+1] = { zone=zone, name=string.toTString"#GOLD##{bold}#Размер иконок#WHITE##{normal}#", status=function(item)
		return tostring(config.settings.tome.hotkey_icons_size)
	end, fct=function(item)
		game:registerDialog(GetQuantity.new("Размер иконок", "От 32 до 64", config.settings.tome.hotkey_icons_size, 64, function(qty)
			qty = util.bound(qty, 32, 64)
			game:saveSettings("tome.hotkey_icons_size", ("tome.hotkey_icons_size = %d\n"):format(qty))
			config.settings.tome.hotkey_icons_size = qty
			game:resizeIconsHotkeysToolbar()
			self.c_list:drawItem(item)
		end, 32))
	end,}

	local zone = Textzone.new{width=self.c_desc.w, height=self.c_desc.h, text=string.toTString"При рождении персонажа часть очков навыков будет распределена автоматически.#WHITE#"}
	list[#list+1] = { zone=zone, name=string.toTString"#GOLD##{bold}#Автораспределение навыков при рождении#WHITE##{normal}#", status=function(item)
		return tostring(config.settings.tome.autoassign_talents_on_birth and "включено" or "отключено")
	end, fct=function(item)
		config.settings.tome.autoassign_talents_on_birth = not config.settings.tome.autoassign_talents_on_birth
		game:saveSettings("tome.autoassign_talents_on_birth", ("tome.autoassign_talents_on_birth = %s\n"):format(tostring(config.settings.tome.autoassign_talents_on_birth)))
		self.c_list:drawItem(item)
	end,}

	local zone = Textzone.new{width=self.c_desc.w, height=self.c_desc.h, text=string.toTString"Always rest to full before auto-exploring.#WHITE#"}
	list[#list+1] = { zone=zone, name=string.toTString"#GOLD##{bold}#Rest before auto-explore#WHITE##{normal}#", status=function(item)
		return tostring(config.settings.tome.rest_before_explore and "включено" or "отключено")
	end, fct=function(item)
		config.settings.tome.rest_before_explore = not config.settings.tome.rest_before_explore
		game:saveSettings("tome.rest_before_explore", ("tome.rest_before_explore = %s\n"):format(tostring(config.settings.tome.rest_before_explore)))
		self.c_list:drawItem(item)
	end,}

	local zone = Textzone.new{width=self.c_desc.w, height=self.c_desc.h, text=string.toTString"Если отключено, окно сообщения о найденной записке будет появляться только только при первом обнаружении этой записки в текущем профиле игрока.\nЕсли включена, окно будет появляться всегда.#WHITE#"}
	list[#list+1] = { zone=zone, name=string.toTString"#GOLD##{bold}#Всегда показывать всплывающее окно записки.#WHITE##{normal}#", status=function(item)
		return tostring(config.settings.tome.lore_popup and "включено" or "отключено")
	end, fct=function(item)
		config.settings.tome.lore_popup = not config.settings.tome.lore_popup
		game:saveSettings("tome.lore_popup", ("tome.lore_popup = %s\n"):format(tostring(config.settings.tome.lore_popup)))
		self.c_list:drawItem(item)
	end,}

	local zone = Textzone.new{width=self.c_desc.w, height=self.c_desc.h, text=string.toTString"Если отключено, предмет при активации не будет добавлен на панель инструментов, это нужно будет сделать вручную в экране рюкзака.#WHITE#"}
	list[#list+1] = { zone=zone, name=string.toTString"#GOLD##{bold}#Всегда добавлять предмет на панль инструментов.#WHITE##{normal}#", status=function(item)
		return tostring(config.settings.tome.auto_hotkey_object and "включено" or "отключено")
	end, fct=function(item)
		config.settings.tome.auto_hotkey_object = not config.settings.tome.auto_hotkey_object
		game:saveSettings("tome.auto_hotkey_object", ("tome.auto_hotkey_object = %s\n"):format(tostring(config.settings.tome.auto_hotkey_object)))
		self.c_list:drawItem(item)
	end,}
--[[
	local zone = Textzone.new{width=self.c_desc.w, height=self.c_desc.h, text=string.toTString"Режим перемещения будет определяться персонажем или существом, которым в данный момент управляет игрок.#WHITE#"}
	list[#list+1] = { zone=zone, name=string.toTString"#GOLD##{bold}#Режим перемещений зависит от персонажа#WHITE##{normal}#", status=function(item)
		return tostring(config.settings.tome.actor_based_movement_mode and "включено" or "отключено")
	end, fct=function(item)
		config.settings.tome.actor_based_movement_mode = not config.settings.tome.actor_based_movement_mode
		game:saveSettings("tome.actor_based_movement_mode", ("tome.actor_based_movement_mode = %s\n"):format(tostring(config.settings.tome.actor_based_movement_mode)))
		self.c_list:drawItem(item)
	end,}
]]

	self.list = list
end
